using System.ComponentModel.DataAnnotations;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;

namespace WpfValidatorDemo;

public partial class MainViewModel : ObservableValidator
{   // 这些校验特性是MicroSoft提供的，本质是反射
    // [EmailAddress]、[Range(18,60)]
    // [NotifyDataErrorInfo]立马校验，而不是在提交的时候ValidateAllProperties校验所有
    // 完整属性在set里用重载setproperty(_name,value,true)开启立即校验，
    // ErrorMessage是校验文字，不写的话就是默认提供的英文
    [ObservableProperty]
    [NotifyDataErrorInfo]
    [Required(ErrorMessage = "用户名不能为空")]
    [MinLength(3, ErrorMessage = "用户名长度不能少于3个字符")]
    [MaxLength(20, ErrorMessage = "用户名长度不能超过20个字符")]
    private string? _username;
    //也可以在分部方法里面完成立即校验
    // partial void OnUsernameChanged(string? value)
    // {
    //     ValidateProperty(value,nameof(Username));
    // }
    [ObservableProperty]
    [NotifyDataErrorInfo]
    [Required(ErrorMessage = "密码不能为空")]
    [MinLength(6, ErrorMessage = "密码长度不能少于6个字符")]
    [RegularExpression(@"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{6,}$", ErrorMessage = "密码必须包含大小写字母和数字")]
    private string? _password;

    [ObservableProperty]
    private string? _loginMessage;

    [RelayCommand]
    private void Login()
    {
        // 手动清空给上一次校验的结果
        ClearErrors();
        // 触发所有属性验证；HasErrors会被自动赋值
        ValidateAllProperties();
        // 检查是否有验证错误
        if (HasErrors)
        {
            string info = string.Join(Environment.NewLine, GetErrors());
            //GetErrors()是一次性返回所有校验错误
            // GetErrors(nameof(Username))返回某个特性属性的错误
            LoginMessage = info ;
            return;
        }
        // 模拟登录逻辑
        if (Username == "admin" && Password == "123")
        {
            LoginMessage = "登录成功！";
        }
        else
        {
            LoginMessage = "登录失败：用户名或密码错误";
        }
    }
}